package cn.iune.backcenter.author;

import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.justep.baas.data.Row;
import com.justep.baas.data.RowState;
import com.justep.baas.data.Table;
import com.justep.baas.data.Transform;

@Transactional
@Service
public class SaOporgServiceImpl implements ISaOporgService {

	@Autowired
	private ISaOporgDao dao;
	

	
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getByID(java.lang.String)
	 */
	@Override
	public SaOporg getByID(String sID) {
		return dao.getByID(sID);
	}
	
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getByFID(java.lang.String)
	 */
	@Override
	public SaOporg getByFID(String sFID) {
		return dao.getByFID(sFID);
	}

	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getByPersonID(java.lang.String)
	 */
	@Override
	public List<SaOporg> getByPersonID(String sPersonID) {
		return dao.getByPersonID(sPersonID);
	}
	
	@Override
	public List<SaOporg> getByPersonOrgID(String sPersonID, String sOrgID) {
		return dao.getByPersonOrgID(sPersonID, sOrgID);
	}
	
	//获取我创建的公司
	@Override
	public List<SaOporg> getOgnsBysCreatorFID(String sCreatorFID) {
		return dao.getOgnsBysCreatorFID(sCreatorFID);
	}
	
	//获取我参与的公司
	@Override
	public List<SaOporg> getOgnsByPersonID(String personID){
		List<SaOporg> list = new ArrayList<SaOporg>();
		
		List<SaOporg> psms = dao.getByPersonID(personID);
		for(SaOporg psm :psms) {
			SaOporg ogn = this.getCompany(psm);
			if(ogn!=null) {
//				System.out.println("psm.getsID()-->>"+psm.getsID());
//				System.out.println("ogn.getsID()-->>"+ogn.getsID());
				//比较是否已经在列表中存在
				boolean isExist = false;
				for(SaOporg li :list) {
//					System.out.println("li.getsID()-->>"+li.getsID());
					if(li.getsID().equals(ogn.getsID())) {
						isExist = true;
					}
				}
				if(isExist==false) {
					list.add(ogn);
				}
			}
		}

		return list;
	}

	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#insert(com.iune.platform.security.SaOporg)
	 */
	@Transactional
	@Override
	public void insert(SaOporg obj){
		dao.insert(obj);
	}

	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#delete(java.lang.String)
	 */
	@Transactional
	@Override
	public void delete(SaOporg obj){
		dao.delete(obj.getsID());
	}
	
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#update(com.iune.platform.security.SaOporg)
	 */
	@Transactional
	@Override
	public void update(SaOporg obj){
		dao.update(obj);
	}
	
	@Transactional
	@Override
	public void delete(JSONObject data) {
		JSONArray ids = data.getJSONArray("ids");
		for(int i=0;i<ids.size();i++){
			String id = ids.getString(i);
			dao.delete(id);
		}
	}

	@Transactional
	@Override
	public JSONObject save(JSONObject object) throws ParseException {
		// JSON转换Table
		Table table = Transform.jsonToTable(object);
		
		JSONObject data = new JSONObject();
		data.put("concept", table.getTableName());
		JSONArray rows = new JSONArray();
		List<String> idsNew = new ArrayList<String>();
		List<String> idsDel = new ArrayList<String>();
				
		List<Row> list = table.getRows();
		for(Row row : list){
			JSONObject javaObject= Transform.rowToJavaObject(table, row);
			SaOporg obj = JSON.toJavaObject(javaObject, SaOporg.class);
			if(RowState.NEW.equals(obj.getRowState())){
				dao.insert(obj);
				idsNew.add(obj.getsID());
			}
			if(RowState.DELETE.equals(obj.getRowState())){
				//由于前端已经将删除的子节点放进删除缓冲区，所以无需下面这段代码特殊处理
				/*
				//删除树形子节点
				List<SaOporg> objs = this.getChildren(obj.getfID());
				for(SaOporg o :objs){
					dao.delete(o.getfID());
				}
				*/
				//删除自身
				dao.delete(obj.getsID());
				idsDel.add(obj.getsID());
			}
			if(RowState.EDIT.equals(obj.getRowState())){
				SaOporg objNew = dao.update(obj);
				//返回+1后的version到前台BizData中进行刷新，使得前台的version与后台的一致。
				///////////////////////////////////////////////////////////////////////
				JSONObject jsonRow = new JSONObject();
				jsonRow.put("id", obj.getsID());
				jsonRow.put("version", objNew.getVersion());
				rows.add(jsonRow);
				//////////////////////////////////////////////////////////////////////
			}
		}
		
		data.put("code", 0);
		data.put("idsNew", idsNew);
		data.put("idsDel", idsDel);
		
		return data;
	}





	/*
	public JSONObject query(JSONObject data) throws Exception {
		
		// 获取参数
		JSONObject columns = data.getJSONObject("columns"); // 列定义
		String orderBy = data.getString("orderBy"); // 排序
		Integer limit = data.getInteger("limit"); // 分页查询的行数
		Integer offset = data.getInteger("offset"); // 分页查询的行偏移
		String search = data.getString("search"); // 检索关键字
		String filter = data.getString("filter"); // 过滤条件
		String id = data.getString("id");
		
		String format = "SELECT %s FROM %s %s %s ";
//		String format = "SELECT SaOporg FROM SaOporg SaOporg %s %s ";
		String select = "SaOporg";
		String from = "SaOporg SaOporg";
		String where = "";
		
		
		// 存放SQL中的参数值
		List<Object> sqlParams = new ArrayList<Object>();
		// 存放SQL中的过滤条件
		List<String> filters = new ArrayList<String>();
		if (Utils.isNotEmptyString(search)) {
			// 增加过滤条件
			filters.add("sFCode LIKE ? OR sFName LIKE ? OR sDescription LIKE ?");
			// 检索关键字中如果没有%，则前后自动加%
			search = (search.indexOf("%") != -1) ? search : "%" + search + "%";
			// sqlParams的参数个数和顺序必须与过滤条件的?相匹配 
			for (int i = 0; i < 3; i++) {
				sqlParams.add(search);
			}
		}
		
		//处理过滤条件
		if (Utils.isNotEmptyString(filter)) {
			filters.add(filter);
		}
		//处理id
		if (Utils.isNotEmptyString(id)) {
			filters.add("sID='"+id+"'");
		}
		
		if(filters != null && filters.size() > 0){
			if(where.indexOf("WHERE")== -1){
				//不包含WHERE关键字
				where = "WHERE " + DataUtils.arrayJoin(filters.toArray(), "(%s)", " AND ");
			}else{
				//已包含
				where = where + " AND " + DataUtils.arrayJoin(filters.toArray(), "(%s)", " AND ");
			}
		}
		orderBy = "sSequence ASC";
//		String where = (filters != null && filters.size() > 0) ? " WHERE " + CommonService.arrayJoin(filters.toArray(), "(%s)", " AND ") : "";
		orderBy = Utils.isNotEmptyString(orderBy) ? " ORDER BY " + orderBy : "";
		
		String sql = String.format(format, select, from, where, orderBy);
	
		//获取数据
		List<Object> list = dao.query(sql,columns,sqlParams,offset,limit);
		List<Row> rows = listToRows(list);
		
		Table table = Transform.createTableByColumnsDefine((JSONObject) columns);
	    table.appendRows(rows);
		
		if (offset != null && offset.equals(0)) {
			String sqlTotal = String.format(format, "COUNT(*)", from, where, orderBy);
			long rowCount = dao.getCount(sqlTotal, sqlParams);
			table.setTotal((int)rowCount);
		}
				
		JSONObject json = Transform.tableToJson(table);
	
		return json;
	}

	public int save(JSONObject object) throws Throwable  {
		// TODO Auto-generated method stub
		// JSON转换Table
		Table table = Transform.jsonToTable(object);
		List<SaOporg> list = rowsToList(table.getRows());
		for(SaOporg obj : list){
			if(RowState.NEW.equals(obj.getRowState())){
				dao.insert(obj);
			}
			if(RowState.EDIT.equals(obj.getRowState())){
				dao.update(obj);
			}
			if(RowState.DELETE.equals(obj.getRowState())){
				dao.delete(obj.getsID());
			}
		}
		return 0;
	}

	public List<Row> listToRows(List<Object> list){
		//添加行集
		List<Row> rows = new ArrayList<Row>();
		//循环行
	    for(Object o : list){
	    	rows.add(objectToRow((SaOporg) o));
	    }
	    return rows;
	}

	public List<SaOporg> rowsToList(List<Row> rows){
		//添加行集
		List<SaOporg> list = new ArrayList<SaOporg>();
		//循环行
	    for(Row r : rows){
	    	list.add(rowToObject(r));
	    }
	    return list;
	}

	public Row objectToRow(SaOporg obj){
    	
		Map<String, ColumnValue> values = new HashMap<String, ColumnValue>();
		//循环行中每一列
		ColumnValue value = new ColumnValue(obj.getsID());
		values.put("sID", value);
		
		value = new ColumnValue(obj.getsName());
		values.put("sName", value);
		value = new ColumnValue(obj.getsCode());
 		values.put("sCode", value);
		value = new ColumnValue(obj.getsLongName());
 		values.put("sLongName", value);
		value = new ColumnValue(obj.getsFName());
 		values.put("sFName", value);
		value = new ColumnValue(obj.getsFCode());
 		values.put("sFCode", value);
		value = new ColumnValue(obj.getsFID());
 		values.put("sFID", value);
		value = new ColumnValue(obj.getsOrgKindID());
 		values.put("sOrgKindID", value);
		value = new ColumnValue(obj.getsSequence());
 		values.put("sSequence", value);
		value = new ColumnValue(obj.getsValidState());
 		values.put("sValidState", value);
		value = new ColumnValue(obj.getsParent());
 		values.put("sParent", value);
		value = new ColumnValue(obj.getsNodeKind());
 		values.put("sNodeKind", value);
		value = new ColumnValue(obj.getsLevel());
 		values.put("sLevel", value);
		value = new ColumnValue(obj.getsPhone());
 		values.put("sPhone", value);
		value = new ColumnValue(obj.getsFax());
 		values.put("sFax", value);
		value = new ColumnValue(obj.getsAddress());
 		values.put("sAddress", value);
		value = new ColumnValue(obj.getsZip());
 		values.put("sZip", value);
		value = new ColumnValue(obj.getsDescription());
 		values.put("sDescription", value);
 		
		value = new ColumnValue(obj.getsPersonID());
 		values.put("sPersonID", value);

		value = new ColumnValue(obj.getsCreatorFID());
 		values.put("sCreatorFID", value);

		value = new ColumnValue(obj.getVersion());
 		values.put("version", value);
		
		Row row = new Row(values,RowState.NONE);
		return row;
	}
	
	public SaOporg rowToObject(Row row){
		SaOporg obj = new SaOporg();
		obj.setsID(row.getString("sID"));
		
		obj.setsName(row.getString("sName"));
		obj.setsCode(row.getString("sCode"));
		obj.setsLongName(row.getString("sLongName"));
		obj.setsFName(row.getString("sFName"));
		obj.setsFCode(row.getString("sFCode"));
		obj.setsFID(row.getString("sFID"));
		obj.setsOrgKindID(row.getString("sOrgKindID"));
		obj.setsSequence(row.getString("sSequence"));
		obj.setsValidState(row.getInteger("sValidState"));
		obj.setsParent(row.getString("sParent"));
		obj.setsNodeKind(row.getString("sNodeKind"));
		obj.setsLevel(row.getInteger("sLevel"));
		obj.setsPhone(row.getString("sPhone"));
		obj.setsFax(row.getString("sFax"));
		obj.setsAddress(row.getString("sAddress"));			
		obj.setsZip(row.getString("sZip"));
		obj.setsDescription(row.getString("sDescription"));
		
		obj.setsPersonID(row.getString("sPersonID"));
		
		obj.setsCreatorFID(row.getString("sCreatorFID"));
		
		obj.setVersion(row.getInteger("version"));
		
		obj.setRowState(row.getState());

		return obj;
	}
	 */
	
	//获取主要的人员成员关系（组织关系）
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getMainPersonMember(com.iune.platform.security.SaOpperson)
	 */
	/*
	@Override
	public SaOporg getMainPersonMember(SaOpperson person){
		if(person==null){
			return null;
		}
		String orgID = person.getsMainOrgID();
		if(Utils.isEmptyString(orgID)){
			return null;
		}
		String sID = orgID + "@" +person.getsID();
//		System.out.println("sID-->"+sID);
		SaOporg saOporg = dao.getByID(sID);
		return saOporg;
	}
	*/
	
	//获取所有的人员成员关系（组织关系）
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getPersonMembers(java.lang.String)
	 */
	@Override
	public List<SaOporg> getPersonMembers(String personID) {
		return dao.getByPersonID(personID);
	}
	//获取特定的人员成员关系（组织关系）
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getPersonMembers(java.lang.String, java.lang.String)
	 */
	@Override
	public List<SaOporg> getPersonMembers(String personID, String orgID) {
		return dao.getByPersonOrgID(personID,orgID);
	}
	//获取父节点
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getParent(com.iune.platform.security.SaOporg)
	 */
	@Override
	public SaOporg getParent(SaOporg org) {
		if(org.getsParent()==null){
			return null;
		}else{
			return dao.getByID(org.getsParent());
		}
	}
	//获取最近一级公司
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getCompany(com.iune.platform.security.SaOporg)
	 */
	@Override
	public SaOporg getCompany(SaOporg org) {
		SaOporg company = this.getParent(org);
		if(company==null) return null;
		while(!company.getsOrgKindID().equals("ogn")){
			company = this.getParent(company);
			if(company==null) return null;
		}
		return company;
	}
	
	//获取当前组织的所有上级组织（包括自己）,但是现定于紧邻的上级公司
	@Override
	public List<SaOporg> getSuperiors(SaOporg obj){
		List<SaOporg> list = new ArrayList<SaOporg>();
		
		String sFID = obj.getsFID();
		//分解全路径，获取IDS
//		System.out.println("sFID-->"+sFID);
		String[] ids = sFID.split("/");
//		for(int i=0;i<ids.length;i++){
		for(int i=ids.length - 1;i>0;i--){
			if(!ids[i].equals("")){
				//去掉扩展名
				String id = ids[i].split("\\.")[0];
				SaOporg org = dao.getByID(id);
				list.add(org);
//				System.out.println(id);
				if(org.getsOrgKindID().equals("ogn")){
					//如果是公司，则停止继续获取上一级
					break;
				}
			}
		}
		return list;
	}
	
	@Override
	public List<String> getSuperiorIDs(SaOporg obj){
		List<String> list = new ArrayList<String>();
		String sFID = obj.getsFID();
		//分解全路径，获取IDS
//		System.out.println("sFID-->"+sFID);
		String[] ids = sFID.split("/");
		for(int i=0;i<ids.length;i++){
			if(!ids[i].equals("")){
				//去掉扩展名
				String id = ids[i].split("\\.")[0];
				/*
				//添加之前，判断是否已经存在
				//单个对象不可能存在重复，所以不使用这段啦
				boolean isExist = false;
				for(String s : list){
					System.out.println("--(id)-------->"+id+"--------(s)-->"+s);
					if(s.equals(id)){
						//如果存在，设定标志后跳出循环
						isExist = true;
						break;
					}
				}
				if(!isExist){
					//如果不存在，添加
					list.add(id);
				}
				*/
				list.add(id);
//				System.out.println(id);
			}
		}
//		SaOporg
		return list;
	}

	//获取所有的人员组织关系，包含人员成员关系
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getPersonOrgs(com.iune.platform.security.SaOpperson)
	 */
	@Override
	public List<SaOporg> getPersonOrgs(String personID) {
        //1根据人员查找到我们定义的人员成员（相当于组织）
        List<SaOporg> saOporgList = this.getPersonMembers(personID);
//        log.info("人员的组织关系数量-->"+saOporgList.size());
        //根据人员成员列表，获得人员成员的上级组织的列表（上级组织被授权的角色也应该为本级使用--权限继承）
        List<SaOporg> saOporgListCopy = new ArrayList<SaOporg>();
        saOporgListCopy.addAll(saOporgList);
        for(SaOporg saOporg : saOporgListCopy){
        	/*
	        String sParent = saOporg.getsParent();
	        if(sParent!=null){
	        	//将上级组织列表添加到组织关系中（用于处理权限继承使用）
	        	saOporgList.add(saOporgUtil.getByID(sParent));
	        }
	        */
        	List<SaOporg> list1 = this.getSuperiors(saOporg);
        	//将上级组织列表添加到组织关系中（用于处理权限继承使用）
        	//首先判断是否已经存在，所以需要使用循环单个加入列表中
        	for(SaOporg o : list1){
				boolean isExist = false;
	        	for(SaOporg r : saOporgList){
//					System.out.println("--(id)-------->"+id+"--------(s)-->"+s);
					if(r.getsID().equals(o.getsID())){
						//如果存在，设定标志后跳出循环
						isExist = true;
						break;
					}
				}
				if(!isExist){
					//如果不存在，添加
		        	saOporgList.add(o);
				}
        	}	
       	
        	//根据全路径ID获取列表
        	
		}

        return saOporgList;
	}
	
	//获取所有的人员组织关系，包含人员成员关系，限定的组织内
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getPersonOrgs(com.iune.platform.security.SaOpperson, com.iune.platform.security.SaOporg)
	 */
	@Override
	public List<SaOporg> getPersonOrgs(String personID, String orgID) {
        //1根据人员查找到我们定义的人员成员（相当于组织）
        List<SaOporg> saOporgList = this.getPersonMembers(personID,orgID);
//        log.info("人员的组织关系数量-->"+saOporgList.size());
        //根据人员成员列表，获得人员成员的上级组织的列表（上级组织被授权的角色也应该为本级使用--权限继承）
        List<SaOporg> saOporgListCopy = new ArrayList<SaOporg>();
        saOporgListCopy.addAll(saOporgList);
        for(SaOporg saOporg : saOporgListCopy){
        	/*
	        String sParent = saOporg.getsParent();
	        if(sParent!=null){
	        	//将上级组织列表添加到组织关系中（用于处理权限继承使用）
	        	saOporgList.add(saOporgUtil.getByID(sParent));
	        }
	        */
        	List<SaOporg> list1 = this.getSuperiors(saOporg);
        	//将上级组织列表添加到组织关系中（用于处理权限继承使用）
        	//首先判断是否已经存在，所以需要使用循环单个加入列表中
        	for(SaOporg o : list1){
				boolean isExist = false;
	        	for(SaOporg r : saOporgList){
//					System.out.println("--(id)-------->"+id+"--------(s)-->"+s);
					if(r.getsID().equals(o.getsID())){
						//如果存在，设定标志后跳出循环
						isExist = true;
						break;
					}
				}
				if(!isExist){
					//如果不存在，添加
		        	saOporgList.add(o);
				}
        	}	
       	
        	//根据全路径ID获取列表
        	
		}

        return saOporgList;
	}
	

	
	
	//添加人员成员
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#add(com.alibaba.fastjson.JSONObject)
	 */
	@Transactional
	@Override
	public void addPersonMember(String orgID, String personID, String personCode, String personName, String sCreatorFID) {
		SaOporg saOporg = this.getByID(orgID);
		/*
		SaOpperson saOpperson = saOppersonService.getByID(personID);
		if(saOporg!=null && saOpperson!=null){
			
		}
		*/
		//添加人员成员
		String sID = orgID + "@" + personID;
		SaOporg saOporgPersonMember = this.getByID(sID);
		if(saOporgPersonMember==null){
			//不存在，新增
			saOporgPersonMember = new SaOporg();
			saOporgPersonMember.setsID(sID);
			saOporgPersonMember.setsName(personName);
			saOporgPersonMember.setsCode(personCode);
			saOporgPersonMember.setsFName(saOporg.getsFName()+"/"+personName);
			saOporgPersonMember.setsFCode(saOporg.getsFCode()+"/"+personCode);
			saOporgPersonMember.setsFID(saOporg.getsFID()+"/"+sID);
			saOporgPersonMember.setsOrgKindID("psm");
			int count = dao.getChildCount(orgID);
			//设置排序号
			saOporgPersonMember.setsSequence(saOporg.getsSequence()+"/"+String.format("%03d", count+1));
			saOporgPersonMember.setsValidState(1);
			saOporgPersonMember.setsParent(orgID);
			saOporgPersonMember.setsNodeKind("nkLeaf");
			saOporgPersonMember.setsLevel(saOporg.getsLevel()+1);
//			saOporgPersonMember.setsPhone(saOpperson.getsOfficePhone());
//			saOporgPersonMember.setsFax(null);
//			saOporgPersonMember.setsAddress(saOpperson.getsFamilyAddress());
//			saOporgPersonMember.setsZip(saOpperson.getsZip());
//			saOporgPersonMember.setsDescription(saOpperson.getsDescription());
			saOporgPersonMember.setsPersonID(personID);
			saOporgPersonMember.setsCreatorFID(sCreatorFID);
			saOporgPersonMember.setVersion(0);
			
			dao.update(saOporgPersonMember);
			//更新人员的主要部门（如果主要部门不存在的情况下）
			/*
			String sMainOrgID = saOpperson.getsMainOrgID();
			if(sMainOrgID==null){
				saOpperson.setsMainOrgID(orgID);
				saOppersonService.update(saOpperson);
			}
			*/
			//如果当前组织的节点类型为nkLeaf，则需要调整为null
			if("nkLeaf".equals(saOporg.getsNodeKind())){
				saOporg.setsNodeKind(null);
				dao.update(saOporg);
			}
		}
		
	}

	/*
	@Transactional
	@Override
	public void addPersonMember(JSONObject data) {
		String orgID = data.getString("orgID");
		String personID = data.getString("personID");
		String personCode = data.getString("personCode");
		String personName = data.getString("personName");
//		System.out.println("orgID-->"+orgID+"--personID-->"+personID);
		String sCreatorFID = data.getString("sCreatorFID");
		this.addPersonMember(orgID, personID, personCode, personName, sCreatorFID);
	}
	*/
	
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getRootIDs(java.lang.String)
	 */
	@Override
	public List<String> getRootIDs(String sCreatorFID) {
		// TODO Auto-generated method stub
		List<String> ids = new ArrayList<String>();
		List<SaOporg> objs = dao.getRoots(sCreatorFID);
		for(SaOporg obj : objs){
			ids.add(obj.getsID());
		}
		return ids;
	}

	
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getChildIDs(java.lang.String)
	 */
	@Override
	public List<String> getChildIDs(String fParent) {
		// TODO Auto-generated method stub
		List<String> ids = new ArrayList<String>();
		List<SaOporg> objs = dao.getChilds(fParent);
		for(SaOporg obj : objs){
			ids.add(obj.getsID());
		}
		return ids;
	}

	//获取ids
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#getIDsByParent(java.lang.String, java.lang.String)
	 */
	@Override
	public List<String> getIDsByParent(String fParent, String enterpriseNo){
		if (fParent!=null && !fParent.equals("")){
			return this.getChildIDs(fParent);
		}else{
			return this.getRootIDs(enterpriseNo);
		}
	}

	//更新sortNo
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#updateSortNo(com.iune.platform.security.SaOporg, java.lang.String)
	 */
	@Transactional
	@Override
	public int updateSortNo(SaOporg fs,String sortNo) {
		fs.setsSequence(sortNo);
		dao.update(fs);
		return 0;
	}

	//排序
	/* (non-Javadoc)
	 * @see com.iune.platform.security.ISaOporgService#sortGroupInfo(java.lang.String, java.util.List)
	 */
	@Transactional
	@Override
	public int sortGroupInfo(String parentID,List<String> ids/*,List<Integer> versions*/){
		//彻底重新排序
		
		//首先获取父级排序号
		String fParent = parentID;
		String sortNoParent = "";
		if (fParent!=null && !fParent.equals("")){
			SaOporg groupInfo = dao.getByID(fParent);//new FileStorage(fParent);
			sortNoParent = groupInfo.getsSequence();
		}
		
		//获取传入的新排序的列表
		int index = 0;
		for(Iterator<String> i = ids.iterator();i.hasNext();){
			String strID = (String)i.next();
			index++;
			//新编写排序号
			//System.out.println("ids."+strID);
			String sortNoChild = "/" + String.format("%03d", index);
			String sortNoNew = sortNoParent + sortNoChild;
			SaOporg groupInfo = dao.getByID(strID);//new FileStorage(strID);
			if (!sortNoNew.equals(groupInfo.getsSequence())){
				//需要更新新序号
				//System.out.println("序号不同，需写入数据库！");
				int updateResult = this.updateSortNo(groupInfo,sortNoNew);
				if (updateResult!=0){
					return -1;
				}
				
				//2、判断是否有下一级
				String nodeKind = groupInfo.getsNodeKind();
				if (!"nkLeaf".equals(nodeKind)){
					//不是叶子，需要处理下一级（递归调用即可）
					//递归调用，处理下级。
					List<String> idsChild = this.getIDsByParent(strID,groupInfo.getsCreatorFID());
//						List<Integer> versionsChild = groupInfo.getVersionsByParent(fParent);
//						FileStorage groupInfoChild = new FileStorage();
					updateResult = this.sortGroupInfo(strID,idsChild /*,versionsChild*/ );
					if (updateResult!=0){
						return -1;
					}
				}
			}
			//System.out.println("旧序号." + groupInfo.getSortNo());
			//System.out.println("新序号." + sortNoNew);
			
		}
		/*
		for(Iterator<Integer> i = versions.iterator();i.hasNext();){
			int iVersion = i.next();
			System.out.println("versions."+iVersion);
		}
		*/
		return 0;
	}
	@Override
	public List<SaOporg> getChildren(String fParent) {
		// TODO Auto-generated method stub
		return dao.getChildren(fParent);
	}
	
	@Override
	public JSONObject newData(JSONObject param) {
		return dao.create(param);
	}
	
	@Override
	public JSONObject deleteData(JSONObject param) {
		//System.out.println("fileFactoryCreate.param-->>"+param.toJSONString());
		JSONArray ids = param.getJSONArray("ids");
		for(int i=0;i<ids.size();i++){
			String id = ids.getString(i);
			//这里可以增加是否可删除的判断
			//删除树形子节点
			List<SaOporg> objs = this.getChildren(id);
			for(SaOporg o :objs){
				dao.delete(o.getsID());
			}
			
			dao.delete(id);
		}

		JSONObject data = new JSONObject();
		data.put("ids", ids);
		
		JSONObject json = new JSONObject();
		json.put("code", 0);
		json.put("msg", "success");
		json.put("data", data);
		
		return json;
	}

	/*
	在@Transaction注解中定义noRollbackFor和RollbackFor指定某种异常是否回滚。 
	@Transactional(noRollbackFor=RuntimeException.class) 
	@Transactional(RollbackFor=Exception.class) 
	*/
	@Transactional
	@Override
	public JSONObject saveData(JSONObject param) {
		//Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚。 
		//如果一个方法抛出Exception或者Checked异常，Spring事务管理默认不进行回滚。 
		// JSON转换Table
		//System.out.println(object);
		JSONObject data;
		try {
			data = this.save(param);
					
			JSONObject json = new JSONObject();
			json.put("code", 0);
			json.put("msg", "success");
			json.put("data", data);
			
			return json;
			
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			JSONObject json = new JSONObject();
			json.put("code", -1);
			json.put("msg", e.getMessage());
			
			return json;
		} 
	}
	
	/* (non-Javadoc)
	 * @see com.iune.erp.baseinfo.aaa#queryJDBC(com.alibaba.fastjson.JSONObject)
	 */
	@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
	@Override
	public JSONObject queryData(JSONObject param){
		//在此层面（ServiceImpl）统一处理异常，此层面直接被controller调用，面对BizData
		
		try {
			JSONObject jsonTable = dao.query(param);
			
			JSONObject json = new JSONObject();
			json.put("code", 0);
			json.put("msg", "success");
			json.put("data", jsonTable);
			
			return json;
		} catch (SQLException e) {
			e.printStackTrace();
			
			JSONObject json = new JSONObject();
			json.put("code", -1);
			json.put("msg", e.getMessage());
			return json;
		}
	}
	
	@Override
	public JSONObject validData(JSONObject param) {
		// TODO Auto-generated method stub
		return null;
	}

		
}
